package com.qige.homework;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @Author qige
 * @Date 2024-08-06 18:50
 * @Description
 */
public class homework2 {
    private static final int BUFFER_SIZE = 1024;

    /*
        2.假设从入学开始所有书写的Java类代码都在d:/huayujava文件夹下，包括多级子文件夹。
        使用IO流获取从入学开始，到目前为止已经写了多少行Java代码。
        提示：其实就是获取d:/huayujava文件夹及其子文件夹下的所有.java文件，
        使用readLine()读取其中每一行，每读取一行，行数加1。所有的文件读取完毕，得.到总共已经写的Java代码行数。需要结合递归实现。
         */
    public static void main(String[] args) throws IOException {
        File file = new File("E:\\JavaSE-Plus");
        int count = selectJava(file);
        System.out.println(count);
    }
    /*public static int selectJava(File file) throws IOException {
        if (!file.exists()){
            throw new FileNotFoundException("源文件夹不存在！");
        }
        int count = 0;
        File[] files = file.listFiles();
        for (File file1 : files) {
            if (file1.isDirectory()){
                selectJava(file1);
            }else {
                if (file1.getName().endsWith(".java")){
                    FileReader fr = new FileReader(file1);
                    BufferedReader br = new BufferedReader(fr);
                    while (true){
                        if (br.readLine() != null){
                            count++;
                        }else {
                            break;
                        }
                    }
                    br.close();
                }
            }
        }
        return count;
    }*/
    public static int selectJava(File file) throws IOException {
        if (file == null || !file.exists()) {
            throw new FileNotFoundException("源文件夹不存在！");
        }
        int count = 0;
        File[] files = file.listFiles();
        if (files != null) {
            for (File subFile : files) {
                count += countLines(subFile);
            }
        }
        return count;
    }
    private static int countLines(File file) throws IOException {
        if (file.isDirectory()) {
            return selectJava(file); // 递归调用，这里假定文件夹深度有限，不会导致栈溢出。
        } else if (file.getName().endsWith(".java")) {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8), BUFFER_SIZE)) {
                int lines = 0;
                while (br.readLine() != null) {
                    lines++;
                }
                return lines;
            }
        }
        return 0;
    }
}
